#pragma once 

#include <iostream>


template <typename T>
class unique_ptr {
public:
    // 构造函数，接管原始指针所有权
    explicit unique_ptr(T* p = nullptr) : ptr(p) {}

    // 析构函数，释放资源
    ~unique_ptr() {
        delete ptr;
        ptr = nullptr;
    }

    // 禁止拷贝构造（独占所有权）
    unique_ptr(const unique_ptr&) = delete;

    // 禁止拷贝赋值
    unique_ptr& operator=(const unique_ptr&) = delete;

    // 移动构造，转移所有权
    unique_ptr(unique_ptr&& other) noexcept : ptr(other.ptr) {
        other.ptr = nullptr;
    }

    // 移动赋值，转移所有权
    unique_ptr& operator=(unique_ptr&& other) noexcept {
        if (this != &other) {
            delete ptr;
            ptr = other.ptr;
            other.ptr = nullptr;
        }
        return *this;
    }

    // 解引用操作符
    T& operator*() const { return *ptr; }

    // 成员访问运算符
    T* operator->() const { return ptr; }

    // 获取原始指针
    T* get() const { return ptr; }

    // 重置指针
    void reset(T* p = nullptr) {
        delete ptr;
        ptr = p;
    }

    // 释放所有权（不释放资源）
    T* release() {
        T* temp = ptr;
        ptr = nullptr;
        return temp;
    }

private:
    T* ptr; // 被管理的原始指针
};
